导航菜单
首页 >  汇编语言第2章 寄存器  > 汇编语言(王爽)第二章寄存器

汇编语言(王爽)第二章寄存器

一个典型的CPU由运算器、控制器、寄存器等部件组成,部件之间靠内部总线连接。运算器进行信息处理,寄存器进行信息存储;控制器控制各部件进行工作,内部总线连接各部件以进行数据的传输。不同的CPU寄存器的个数和结构都是不尽相同的。

2.1通用寄存器

以8086为例,其内部所有寄存器都是16位的,即两个字节。其中AX、BX、CX、DX这4个通常存放一般性的数据,称为通用寄存器。AX的低8位(0~7位)构成一个8位寄存器AL,高8位(8~15位)构成一个8位寄存器AH,其他也类似。

若:AX=8000H;对于指令add ax,8888H后ax的值是多少?

8000H+8888H=10888H,但AX只能保存16位数,因此ax=0888H,最高位的“1”会被AX舍弃,但CPU并不舍弃这个“1”。

若:ax=0080H,对于指令add al,88H后ax的值是多少?

80H+88H=108H,但al只能保存8位,因此al=08H,最高位的“1”被al舍弃,也不会被ah接收,因此ax=0008H,同样CPU不舍弃这个“1”。

上述两例中溢出产生的“1”都会被存放在一个特定位置,后面会学到。

检测点2.1

(1)写出每条汇编指令执行后相关寄存器的值:

mov ax,62627   ax=f4a3H

mov ah,31H      ax=31a3H

mov al,23H ax=3123H

add ax,ax   ax=6246H

mov bx,826cH  bx=826cH

mov cx,ax  cx=6246H

mov ax,bx ax=826cH

add ax,bx        ax=04d8H

mov al,bh   ax=0482H

mov ah,bl        ax=6c82H

add ah,ah        ax=d882H

add al,6     ax=d888H

add al,al     ax=d810H

mov ax,cx        ax=6246H

(2)只能使用目前学过的汇编指令,最多用4条指令,编程计算2的4次方

mov ax,2

add ax,ax

add ax,ax

add ax,ax

2.6  8086CPU给出物理地址的方法:8086有20根地址总线,寻址能力为1MB;而8086又是16位结构,在内部一次性处理的位数为16位,如果在其内部不进行处理,那只能发出最多16位的地址,即寻址能力只有64KB;为使其外部地址总线20根能都被用到,则须在其内部进行处理。这种处理方式就是用段地址和偏移地址组合的方式组成20位地址:段地址和偏移地址均为16位,通过加法运算器的运算,具体为段地址*16+偏移地址,得到20位地址数据后送入输入输出电路,再从8086内部通过输入输出电路将这20位地址送上地址总线。

2.8  段的概念:对于物理上的内存而言,并没有分段的概念。只是对于CPU来说,通过段地址+偏移地址的方式进行寻址,“段”仅仅是一个逻辑上的概念,并无特定之说。对于同一个物理内存地址来说,它的段地址也并不是固定的,比如物理地址10086H,可以设其段地址为1000H,那么对应的偏移地址就是0086H;若设其段地址为1008H,那它偏移地址就是0006H。

检测点2.2

(1)给定段地址0001H,仅仅通过变换偏移地址寻址,CPU的寻址范围是(00010H)~(1000FH)。

(2)有一数据存放在内存20000H中,现在给定段地址为SA,若想用偏移地址寻到此单元,则SA应满足的条件为:最小:1001H;最大:2000H。

2.9段寄存器:8086有4个段寄存器,当CPU需要访问内存单元时,由这4个寄存器存放段地址。

2.10CS和IP:在8086PC机中,任意时候,CPU都讲从CS:IP指向的内存单元开始读第一条指令并执行。8086CPU工作过程可以简要描述如下:

(1)从CS:IP指向的内存单元取出指令,将指令传送到指令缓冲器;

(2)IP更新为原IP+读取指令长度;

(3)执行(1)指令缓冲器中的指令。转到(1)。

2.11通过JMP指令修改CS和IP的值;如jmp 2168:8;执行后CS=2168H,IP=0008H。8086指令集中不提供通过mov来改变CS、IP的值。若仅想改变IP的值,则可通过“jmp 寄存器”指令完成,如:jmp ax;若此时ax=1008H,则指令执行后ip=1008H;

检测点2.3

下面的3条指令执行后,CPU几次修改IP?在何时?最后IP中的值是多少?

mov ax,bx       

sub ax,ax

jmp ax

答:指令执行前CS:IP指向第一条指令存放的内存单元首地址,第一条先读取进入指令缓冲器,IP第一次改变,同时指向第二条指令;第一条指令执行,读取第二条指令进入指令缓冲器,IP第二次改变,同时指向第三条指令;第二条指令执行,读取第三条指令进入指令缓冲器,IP第三次改变,同时指向第三条指令在内存中的后续内存单元;第三条指令执行,IP中的值变为ax中存放的值,这是IP第四次改变。

实验1:

1、关于DEBUG的使用和命令

(1)r命令:可查看CPU中各寄存器的值,并显示当前CS:IP指向的指令。

(2)"r  寄存器名称“命令:修改该寄存器的值。

(3)d命令:"d  段地址:偏移地址“查看以该地址起始的128个内存单元的值,并在右侧显示对应ASCII的显示符。如:d 1000:0则查看从10000H到1007fH;如d 1000:2则查看从10002H到10081H。

若要查看内存中指定几个连续单元的值,则用"d 段地址:起始偏移地址  终止偏移地址”;如d 1000:2 8查看的是10002H到10008H这7个内存单元的值。

(4)e命令:修改某段内存单元的值。”e 段地址:偏移地址  修改值1  修改值2  。。。“;如”e 1000:2 0 1 2 3 4"则将地址10002H到10006H中的值分别修改成:0、1、2、3、4。

(5)u命令:“u 段地址:偏移地址”查看以该地址起始的指令序列。

(6)t命令:单步执行当前CS:IP指向的指令。

 

  

 

 

 

相关推荐: